// 入口用于执行命令行程序
package main

import (
	"fmt"
	"time"

	"gitee.com/lyuanbo/stock-plus/internal/di"
	"gitee.com/lyuanbo/stock-plus/internal/worker"
	"gitee.com/lyuanbo/stock-plus/pkg/version"
	"github.com/imroc/req/v3"
	gosvc "github.com/judwhite/go-svc"
)

type StockService struct {
	app *di.App
}

// Init 初始化
func (s *StockService) Init(_ gosvc.Environment) error {
	// 打印version
	version.Print()

	// 加载上海时区
	loc, err := time.LoadLocation("Asia/Shanghai")
	if err != nil {
		panic(err)
	}
	time.Local = loc

	s.app = di.Init()
	return nil
}

func (s *StockService) Start() error {
	// 监听配置更新
	s.app.SvcCtx.Conf.Watch(s.app.SvcCtx.Nats)

	// 开启请求调试
	if s.app.SvcCtx.Conf.Get().EnableReqDebug {
		req.DevMode()
		req.DisableDumpAll().DisableDebugLog().DisableTraceAll()
	}

	// 启动股票
	// 定时任务
	s.app.StockSvc.Start()

	s.app.HTTPSvc.Start()

	// 启动worker
	worker.Run(s.app.SvcCtx)

	return nil
}

func (s *StockService) Stop() error {
	// 关闭nats连接
	s.app.SvcCtx.Nats.Close()

	// 关闭redis连接
	if s.app.SvcCtx.Redis != nil {
		if err := s.app.SvcCtx.Redis.Close(); err != nil {
			return err
		}
	}

	// 关闭日志
	if s.app.SvcCtx.Logger != nil {
		_ = s.app.SvcCtx.Logger.Sync()
	}

	// 提交questdb连接
	if s.app.SvcCtx.ClickHouse != nil {
		_ = s.app.SvcCtx.ClickHouse.Close()
	}

	_ = s.app.HTTPSvc.Hz.Shutdown(s.app.SvcCtx.Ctx)
	return nil
}

func main() {
	err := gosvc.Run(&StockService{})
	if err != nil {
		fmt.Println(err)
		return
	}
}
